package packLigaDeFutbol;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 * @author jonatanperez
 * Configura la temporada realizando el sorteo y asignando el árbitro que arbitrará cada partido 
 */

public class Temporada {
	private static Temporada miTemporada = new Temporada(null);
	private int id;
	private Calendar fechaInicio;
	private ListaEquipos listaEquipos = new ListaEquipos();
	private ListaArbitros listaArbitros = new ListaArbitros();
	private ListaJornadas listaJornadas = new ListaJornadas();

	private Temporada(Calendar pFechaInicio) {
		this.fechaInicio = pFechaInicio;
	}
	
	public static Temporada getTemporada() {
		return miTemporada;
	}

	public int getID() {
		return this.id;
	}
	
	public void setID(int pId) {
		this.id = pId;
	}

	public Calendar getFechaInicio() {
		return this.fechaInicio;
	}

	public ListaEquipos getListaEquipos() {
		return this.listaEquipos;
	}

	public ListaArbitros getListaArbitros() {
		return this.listaArbitros;
	}

	public ListaJornadas getListaJornadas() {
		return this.listaJornadas;
	}

	public void realizarSorteo(int numEquiposParticipantes, String fechaInicio, ArrayList<Equipo> equipos, ArrayList<Arbitro> arbitros) throws ParseException {
		DateFormat formatter = new SimpleDateFormat("yyyy-MM-DD");
		Date date = (Date)formatter.parse(fechaInicio);
		Calendar fecha = Calendar.getInstance();
		fecha.setTime(date);
		Temporada.getTemporada().setFechaInicio(fecha);
		//Insertamos la Temporada en la BD y devolvemos su id (no se puede conseguir al hacer el insert puesto que es auto-incremental) 
		int idTemporada = GestorTemporadas.get().insertarTemporadaEnBD(this);
		Temporada.getTemporada().setID(idTemporada);
		if(idTemporada != -1) {
			//Inicializamos las jornadas, insertamos (numEquiposParticipantes-1)*2 jornadas
			Temporada.getTemporada().getListaJornadas().inicializar(idTemporada, numEquiposParticipantes, fecha);
			//Cargamos en la BD las tablas TemporadaEquipo y TemporadaArbitro
			Temporada.getTemporada().cargarDatos(equipos, arbitros);
			//Barajamos la lista de equipos
			Temporada.getTemporada().getListaEquipos().barajar();
			Jornada jornada1 = getListaJornadas().obtenerJornada(1);
			//Realizamos el sorteo de la jornada 1
			jornada1.sortearPrimeraJornada(this.getListaEquipos());
			int i = 2;
			//Realizamos el sorteo de la jornada 2
			Jornada pJornadaAnterior = Temporada.getTemporada().getListaJornadas().getListaJornadas().get(i-1).inicializarSiguienteJornada(numEquiposParticipantes, i, jornada1); //Realizamos el sorteo de la segunda jornada en base a la jornada 1

			//Realizamos el sorteo de la jornada 3 hasta el final de la primera vuelta
			for(i = 3; i <= numEquiposParticipantes - 1; i++) {
				pJornadaAnterior = Temporada.getTemporada().getListaJornadas().getListaJornadas().get(i-1).inicializarSiguienteJornada(numEquiposParticipantes, i, pJornadaAnterior); //Realizamos el sorteo desde la jornada 3 hasta que acabe la primera vuelta
			}
			//Realizamos el sorteo de la segunda vuelta
			this.getListaJornadas().sortearSegundaVuelta(numEquiposParticipantes);

			//Asignamos un árbitro a cada partido
			ArrayList<Arbitro> listaAux = new ArrayList<Arbitro>();
			for (Arbitro arbitro : arbitros) {
				listaAux.add(arbitro);
			}
			for(i = 1; i <= Temporada.getTemporada().getListaJornadas().getTamano(); i++) {
				Jornada jornada = Temporada.getTemporada().getListaJornadas().obtenerJornada(i);
				int idJornada = jornada.getID();
				for(int j = 0; j < jornada.getListaPartidos().getTamano(); j++) {
					Partido pPartido = jornada.getListaPartidos().get(j);
					pPartido.setIdJornada(idJornada);
					Arbitro elArbitro = pPartido.asignarArbitro(listaAux);
					GestorPartidos.get().agregarPartidoALista(pPartido);
					listaAux.remove(elArbitro);
				}
				listaAux.clear();
				for (Arbitro arbitro : arbitros) {
					listaAux.add(arbitro);
				}
			}
			GestorPartidos.get().insertarPartidosEnBD();
		}else{
			JOptionPane.showMessageDialog(new JFrame(), 
					"No se ha podido crear la temporada.", 
					"Insertar Temporadas",JOptionPane.ERROR_MESSAGE);
		}
	}

	private void setFechaInicio(Calendar fecha) {
		this.fechaInicio = fecha;
	}

	public void cargarDatos(ArrayList<Equipo> equipos, ArrayList<Arbitro> arbitros) {
		GestorTemporadas.get().insertarEquipoEnBD(this);
		for(int i = 0; i < equipos.size(); i++) {			
			this.getListaEquipos().anadirEquipo(equipos.get(i));
		}

		GestorTemporadas.get().insertarArbitroEnBD(this);
		for(int i = 0; i < arbitros.size(); i++) {
			this.getListaArbitros().anadirArbitro(arbitros.get(i));
		}
	}
}